home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1997 September / Macworld (1997-09).dmg / Serious Software / Cherwell Scientific Demos / pro Fit / pro Fit 5.0 demo (fpu).sea / pro Fit 5.0 demo (fpu) / Functions & Programs / •Gadgets / Peaks < prev    next >
Text File  |  1996-06-01  |  3KB  |  107 lines

  1. {
  2.  This function allows you to easily fit multiple Gaussian peaks.
  3.  
  4.  To compile the function, click the button "Add" above.
  5.  
  6.  To start a fit, first display your data in the preview window.
  7.  Also make sure that the function 'Peaks' is displayed in the 
  8.  parameter window: choose Peaks from the Func menu, then check
  9.  "Show function" in the preview.
  10.  
  11.  Now, you should set the parameters 'const' and 'm' of the
  12.  function. These parameters describe the background of your
  13.  data. You must set these parameters such that the function
  14.  approximately goes through the lowermost data points of your
  15.  data set.
  16.  To do this, you preferably use the Fit tool of the preview window.
  17.  
  18.  Then you choose the Marker tool of the preview window and set a
  19.  marker on top of each peak you see in your data. Once this is
  20.  done, click the button "Read Markers" in the parameters window.
  21.  This sets the position and amplitude of all gaussian peaks.
  22.  
  23.  In a next step, set the parameters k1, k2, etc. such that each
  24.  peak has approximately the correct width. You again can use
  25.  the Fitting tool in the parameter window for this work.
  26.  
  27.  Finally, choose "Nonlinear Fit..." from the Calc menu to run the
  28.  fit. 
  29.  
  30.  
  31.  This example shows how to use the markers in the preview window
  32.  from a function/program. It also shows how to bring up a button
  33.  in the Parameters window.
  34. }
  35.  
  36. function Peaks;
  37.  
  38. defaults
  39.   a[1] := 3,constant,'#peaks',0,9;
  40.   a[2] := 0,active,'const';
  41.   a[3] := 0,active,'m';
  42.  
  43.   a[4] := 0,active,'x1'; a[5] := 1,active,'A1'; a[6] := 1,active,'k1';
  44.   a[7] := 5,active,'x2'; a[8] := 1,active,'A2'; a[9] := 1,active,'k2';
  45.   a[10] := 10,active,'x3'; a[11] := 1,active,'A3'; a[12] := 1,active,'k3';
  46.   a[13] := 15,active,'x4'; a[14] := 1,active,'A4'; a[15] := 1,active,'k4';
  47.   a[16] := 20,active,'x5'; a[17] := 1,active,'A5'; a[18] := 1,active,'k5';
  48.   a[19] := 25,active,'x6'; a[20] := 1,active,'A6'; a[21] := 1,active,'k6';
  49.   a[22] := 30,active,'x7'; a[23] := 1,active,'A7'; a[24] := 1,active,'k7';
  50.   a[25] := 35,active,'x8'; a[26] := 1,active,'A8'; a[27] := 1,active,'k8';
  51.   a[28] := 40,active,'x9'; a[29] := 1,active,'A9'; a[30] := 1,active,'k9';
  52.  
  53. description
  54.   'Multiple Gaussian peaks. #peaks = number of peaks.',
  55.   '$BRead Markers...$ y := SUM(Ai*exp(-ki*(x-xi)^2)) + const';
  56.   {note that the second string starts with $B...$, which indicates
  57.    that there should be a button in the Parameters window}
  58.  var
  59.    i:integer;
  60.  
  61. procedure Check;
  62.  var xm, ym,i,max;
  63. begin
  64.  if pNumber = 30000 then  {if button clicked, pNumber is always 30000}
  65.  begin
  66.   max := 0;
  67.   for i := 0 to 8 do
  68.   begin
  69.     GetMarkedCoord(i,xm,ym);
  70.     if not (Invalid(xm) or Invalid(ym)) then
  71.     begin
  72.       SetParamDefaultValue(3*i+4, xm);
  73.       SetParamDefaultValue(3*i+5, ym-a[2]-a[3]*xm);
  74.       max := i+1;
  75.     end
  76.     else
  77.       SetParamDefaultValue(3*i+5, 0);
  78.   end;
  79.   SetParamDefaultValue(1, max);
  80.   check := update;
  81.  end
  82.  else if pNumber = 1 then
  83.  begin
  84.    for i := 0 to 8 do
  85.      if a[1] > i then
  86.      begin
  87.         if mode[3*i+3] = constant then mode[3*i+4] := active;
  88.         if mode[3*i+4] = constant then mode[3*i+5] := active;
  89.         if mode[3*i+5] = constant then mode[3*i+6] := active;
  90.      end
  91.      else
  92.      begin
  93.        mode[3*i+4] := constant;
  94.        mode[3*i+5] := constant;
  95.        mode[3*i+6] := constant;
  96.      end;
  97.    check := update;
  98.  end
  99.  else check := ok;
  100. end;
  101.  
  102. begin
  103.   y := a[2] + a[3]*x;
  104.   for i := 1 to a[1] do
  105.     y := y + a[3*i+2]*exp(-a[3*i+3]*sqr(x-a[3*i+1]));
  106. end;
  107.